#include <iostream>
using namespace std;

void xprintf()
{
    cout<<endl;//换行 
}

/*C++风格的补丁参函数使用*/
//这行声明了一个模板，它能接收至少 1 个类型（T），后面还能跟着任意数量类型（Args 包 ）。
template<typename T,typename ...Args>//不定参的参数包类型,Args 是一个 “包”，可以包含零个或多个类型
void xprintf(const T&v,Args&&... args)
{
    cout<<v;//先将V打印了
    if(sizeof ...(args)>0)//；利用sizeof算出参数包中的参数的个数,这里的args得括起来，不然会报错
    {
        xprintf(forward<Args>(args)...);//进行一个完美转发，将参数包中的参数转发给xprintf，递归调用
        //这个完美转发的话就是说，你原先传过来的是一个左值那就是左值，右值就是右值，通过完美转发不会改变性质的
        //因为我们要是传递多个参数的，而不是一个参数包，所以我们需要对这个参数包进行一个展开操作，直接在后面加上...就行了
    }
    else//如果参数没有了的话
    {
        xprintf();
    }
    
}
//上面的写法可能会出问题，因为到最后的话是没有参数的，所以会报错，所以我们需要改一下：

int main()
{
    xprintf("kaizi");
    xprintf("kaizi","666");
    return 0;
}